The pfxunmap() entry point is only called when the mapped region has been completely unmapped by all processes. For example, suppose a parent process calls mmap() to map a device. Then the parent creates one or more child processes using sproc(). Each child shares the address space, including the mapped segment. A process in the share group can terminate, or can explicitly unmap() the segment or part of the segment; these actions do not result in a call to pfxunmap(). Only when the last process with access to the segment has fully unmapped the segment is pfxunmap() called.
On entry, the kernel has completed unmapping the object from the user process address space. This entry point does not need to do anything to affect the user address space; it only needs to release any resources that were allocated to support the mapping.
The prototype is
The argument values areint pfxunmap(dev_t dev, vhandl_t *vt);
dev | A dev_t value from which you can extract both the major and minor device numbers. |
vt | The address of an opaque structure that describes the assigned address in the user process address space. |
If the driver allocated no resources to support a mapping, no action is needed here; the entry point can consist of a "return 0" statement.
When the driver does allocate memory to support a mapping, and supports multiple mappings, the driver needs to identify the resource associated with this particular mapping in order to release it. The vt_gethandle() function returns a unique number based on the vt argument; this can be used to identify resources.